# 4.2. UI control UI控制

这里介绍操作游戏 UI 的类和方法。

# Switch

操作游戏内的开关。使用场景:三种阵型的切换,周回模式开关等。

以切换普通图困难图为例:

# 创建开关
MODE_SWITCH_1 = Switch('Mode_switch_1')
# 定义状态
MODE_SWITCH_1.add_status('normal', SWITCH_1_NORMAL, sleep=STAGE_SHOWN_WAIT)
MODE_SWITCH_1.add_status('hard', SWITCH_1_HARD, sleep=STAGE_SHOWN_WAIT)

class Test(ModuleBase):
    def test(self):
        # 判断开关是否出现在画面上
        MODE_SWITCH_1.appear(main=self)
        # 获取当前状态
        status = MODE_SWITCH_1.get(main=self)
        # 切换至某个状态
        MODE_SWITCH_1.set('normal', main=self)

# Scroll

操作游戏内的滚动条。

以委托列表滚动条为例:

# 创建滚动条
COMMISSION_SCROLL = Scroll(COMMISSION_SCROLL_AREA, color=(247, 211, 66), name='COMMISSION_SCROLL')

class Test(ModuleBase):
    def test(self):
        # 判断是否有滚动条
        COMMISSION_SCROLL.appear(main=self)
        # 获取当前位置
        posi = COMMISSION_SCROLL.cal_position(main=self)
        # 判断是否在顶端或底端
        COMMISSION_SCROLL.at_top(main=self)
        COMMISSION_SCROLL.at_bottom(main=self)
        # 拖拽至指定位置
        COMMISSION_SCROLL.set(0.5, main=self)
        # 拖拽至顶端或底端
        # 与直接拖拽至指定位置的区别是,这两个会拖出头,以保证滚动条到达端部
        COMMISSION_SCROLL.set_top(main=self)
        COMMISSION_SCROLL.set_bottom(main=self)
        # 翻页,往下翻0.5页,翻页只是大致准确
        COMMISSION_SCROLL.drag_page(0.5, main=self)
        # 往上或往下翻一页,由于翻页只是大致准确,默认翻的是0.8页,以防止漏掉一些内容
        COMMISSION_SCROLL.prev_page(main=self)
        COMMISSION_SCROLL.next_page(main=self)

操作游戏内的标签页。

以建造页面的左侧边栏为例:

# 每个标签的 Button 阵列
gacha_side_navbar = ButtonGrid(
    origin=(21, 126), delta=(0, 98),
    button_shape=(60, 80), grid_shape=(1, 5),
    name='GACHA_SIDE_NAVBAR')
# 创建标签页
GACHA = Navbar(grids=gacha_side_navbar,
    active_color=(247, 255, 173),
    inactive_color=(140, 162, 181))

class Test(ModuleBase):
    def test(self):
        # 获取标签页的序号
        current = GACHA.get_active(main=self)
        # 获取标签实际出现的个数
        total = GACHA.get_total(main=self)
        # 切换至指定的标签页,上下左右设置一个即可
        GACHA.set(main=self, left=None, right=None, upper=None, bottom=None)
        # 切换至从下往上数的第二个标签
        GACHA.set(main=self, bottom=2)

# Page

游戏界面类。

以收获界面为例:

# 创建 Page 对象,使用的 check_button 需要是唯一的
# 如果画面中出现了REWARD_CHECK,Alas就认为现在在page_reward界面中
page_reward = Page(REWARD_CHECK)
# 定义界面切换
# 点击什么按钮,会到达什么界面
page_reward.link(button=REWARD_GOTO_MAIN, destination=page_main)
page_main.link(button=MAIN_GOTO_REWARD, destination=page_reward)

# 界面切换

Alas 的游戏界面切换是自动的,带有寻路的。Alas 可以在绝大多数的游戏界面下启动,并沿着最短路径切换到它需要的游戏界面,与许多脚本都需要在主界面中启动不同。

所有操作游戏界面的方法都包含重试。

# ui_click()

点击 UI 上的按钮,切换至下一界面。相当于是封装了:

while 1:
    self.device.screenshot()
    if self.appear(appear_button):
        self.device.click(click_button)
    if self.appear(check_button):
        break
  • appear_button 如果出现了这个按钮,就点击 click_button
  • click_button 需要点击的按钮,为设置时,等于 appear_button
  • check_button 如果出现了这个按钮,认为界面切换完成
  • additional 点击可能会出现的按钮,例如弹窗确认

# ui_get_current_page()

获取当前界面。self.ui_current 即是当前界面。

Alas 启动时会调用这个方法,如果游戏未启动,抛出 GameNotRunningError,被顶层捕获后,启动游戏并继续。

# ui_goto()

沿最短路径切换到指定界面,即便歪去别的界面也能自动纠正。

# ui_ensure()

相当于 ui_get_current_page() + ui_goto()

# ui_ensure_index()

地图章节翻页,包含重试以防止没翻到或者翻过头。使用场景:设置地图章节,选择队伍,设置猫箱购买数量等。

  • index 目标数字
  • letter 当前数字,可以是获取当前数字的方法,也可以是 OCR 类
  • prev_button 往前的按钮
  • next_button 往后的按钮
  • fast True则一次性点完,不对再重试。False则点一下识别一下。False用在队伍选择上,因为如果少了一队,数字就不连续了。

# ui_goto_main()

前往主界面

# ui_back()

点返回箭头

# ui_additional()

处理各种可能在界面切换期间出现的弹窗。